package org.convallaria.framework.common.constants.sys;

/**
 * 系统操作日志相关常量
 * 
 * 功能特性：
 * - 定义操作状态常量
 * - 定义业务类型常量
 * - 定义操作类别常量
 * - 定义操作日志字段长度限制
 * - 提供统一的常量管理
 * 
 * 设计原则：
 * - 所有常量都是public static final
 * - 使用final类防止继承
 * - 私有构造函数防止实例化
 * - 按功能模块分组组织
 * 
 * @author convallaria
 * @since 1.0.0
 */
public final class OperLogConstants {

    private OperLogConstants() {
        // 防止实例化
    }

    // ==================== 操作状态常量 ====================

    /**
     * 操作正常
     */
    public static final int OPER_STATUS_NORMAL = 0;

    /**
     * 操作异常
     */
    public static final int OPER_STATUS_EXCEPTION = 1;

    // ==================== 业务类型常量 ====================

    /**
     * 其它
     */
    public static final int BUSINESS_TYPE_OTHER = 0;

    /**
     * 新增
     */
    public static final int BUSINESS_TYPE_INSERT = 1;

    /**
     * 修改
     */
    public static final int BUSINESS_TYPE_UPDATE = 2;

    /**
     * 删除
     */
    public static final int BUSINESS_TYPE_DELETE = 3;

    /**
     * 授权
     */
    public static final int BUSINESS_TYPE_GRANT = 4;

    /**
     * 导出
     */
    public static final int BUSINESS_TYPE_EXPORT = 5;

    /**
     * 导入
     */
    public static final int BUSINESS_TYPE_IMPORT = 6;

    /**
     * 强退
     */
    public static final int BUSINESS_TYPE_FORCE = 7;

    /**
     * 生成代码
     */
    public static final int BUSINESS_TYPE_GENCODE = 8;

    /**
     * 清空数据
     */
    public static final int BUSINESS_TYPE_CLEAN = 9;

    // ==================== 操作类别常量 ====================

    /**
     * 其它
     */
    public static final int OPERATOR_TYPE_OTHER = 0;

    /**
     * 后台用户
     */
    public static final int OPERATOR_TYPE_MANAGE = 1;

    /**
     * 手机端用户
     */
    public static final int OPERATOR_TYPE_MOBILE = 2;

    // ==================== 操作日志字段长度限制 ====================

    /**
     * 模块标题最大长度
     */
    public static final int TITLE_MAX_LENGTH = 50;

    /**
     * 方法名称最大长度
     */
    public static final int METHOD_MAX_LENGTH = 100;

    /**
     * 请求方式最大长度
     */
    public static final int REQUEST_METHOD_MAX_LENGTH = 10;

    /**
     * 操作人员最大长度
     */
    public static final int OPER_NAME_MAX_LENGTH = 50;

    /**
     * 部门名称最大长度
     */
    public static final int DEPT_NAME_MAX_LENGTH = 50;

    /**
     * 请求URL最大长度
     */
    public static final int OPER_URL_MAX_LENGTH = 255;

    /**
     * 主机地址最大长度
     */
    public static final int OPER_IP_MAX_LENGTH = 128;

    /**
     * 操作地点最大长度
     */
    public static final int OPER_LOCATION_MAX_LENGTH = 255;

    /**
     * 请求参数最大长度
     */
    public static final int OPER_PARAM_MAX_LENGTH = 2000;

    /**
     * 返回参数最大长度
     */
    public static final int JSON_RESULT_MAX_LENGTH = 2000;

    /**
     * 错误消息最大长度
     */
    public static final int ERROR_MSG_MAX_LENGTH = 2000;

    /**
     * 备注最大长度
     */
    public static final int REMARK_MAX_LENGTH = 500;

    // ==================== 操作状态描述 ====================

    /**
     * 操作状态描述映射
     */
    public static final String[] OPER_STATUS_DESCRIPTIONS = {
        "正常", "异常"
    };

    /**
     * 业务类型描述映射
     */
    public static final String[] BUSINESS_TYPE_DESCRIPTIONS = {
        "其它", "新增", "修改", "删除", "授权", "导出", "导入", "强退", "生成代码", "清空数据"
    };

    /**
     * 操作类别描述映射
     */
    public static final String[] OPERATOR_TYPE_DESCRIPTIONS = {
        "其它", "后台用户", "手机端用户"
    };

    // ==================== 默认值常量 ====================

    /**
     * 默认操作状态
     */
    public static final int DEFAULT_OPER_STATUS = OPER_STATUS_NORMAL;

    /**
     * 默认业务类型
     */
    public static final int DEFAULT_BUSINESS_TYPE = BUSINESS_TYPE_OTHER;

    /**
     * 默认操作类别
     */
    public static final int DEFAULT_OPERATOR_TYPE = OPERATOR_TYPE_OTHER;

    /**
     * 默认消耗时间（毫秒）
     */
    public static final long DEFAULT_COST_TIME = 0L;

    // ==================== 业务规则常量 ====================

    /**
     * 请求方式正则表达式（字母、数字、连字符）
     */
    public static final String REQUEST_METHOD_PATTERN = "^[a-zA-Z0-9-]+$";

    /**
     * IP地址正则表达式（IPv4和IPv6）
     */
    public static final String OPER_IP_PATTERN = "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$|^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$";

    /**
     * 最大消耗时间（毫秒）
     */
    public static final long MAX_COST_TIME = 300000L; // 5分钟

    // ==================== 常用请求方式常量 ====================

    /**
     * GET请求
     */
    public static final String REQUEST_METHOD_GET = "GET";

    /**
     * POST请求
     */
    public static final String REQUEST_METHOD_POST = "POST";

    /**
     * PUT请求
     */
    public static final String REQUEST_METHOD_PUT = "PUT";

    /**
     * DELETE请求
     */
    public static final String REQUEST_METHOD_DELETE = "DELETE";

    /**
     * PATCH请求
     */
    public static final String REQUEST_METHOD_PATCH = "PATCH";

    /**
     * OPTIONS请求
     */
    public static final String REQUEST_METHOD_OPTIONS = "OPTIONS";

    /**
     * HEAD请求
     */
    public static final String REQUEST_METHOD_HEAD = "HEAD";

    // ==================== 工具方法 ====================

    /**
     * 获取操作状态描述
     * 
     * @param status 状态值
     * @return 状态描述
     */
    public static String getOperStatusDesc(Integer status) {
        if (status == null) {
            return "未知";
        }
        if (status == OPER_STATUS_NORMAL) {
            return OPER_STATUS_DESCRIPTIONS[0];
        } else if (status == OPER_STATUS_EXCEPTION) {
            return OPER_STATUS_DESCRIPTIONS[1];
        }
        return "未知";
    }

    /**
     * 获取业务类型描述
     * 
     * @param businessType 业务类型
     * @return 业务类型描述
     */
    public static String getBusinessTypeDesc(Integer businessType) {
        if (businessType == null) {
            return "未知";
        }
        if (businessType >= 0 && businessType < BUSINESS_TYPE_DESCRIPTIONS.length) {
            return BUSINESS_TYPE_DESCRIPTIONS[businessType];
        }
        return "未知";
    }

    /**
     * 获取操作类别描述
     * 
     * @param operatorType 操作类别
     * @return 操作类别描述
     */
    public static String getOperatorTypeDesc(Integer operatorType) {
        if (operatorType == null) {
            return "未知";
        }
        if (operatorType >= 0 && operatorType < OPERATOR_TYPE_DESCRIPTIONS.length) {
            return OPERATOR_TYPE_DESCRIPTIONS[operatorType];
        }
        return "未知";
    }

    /**
     * 验证操作状态是否有效
     * 
     * @param status 状态值
     * @return true=有效，false=无效
     */
    public static boolean isValidOperStatus(Integer status) {
        return status != null && (status == OPER_STATUS_NORMAL || status == OPER_STATUS_EXCEPTION);
    }

    /**
     * 验证业务类型是否有效
     * 
     * @param businessType 业务类型
     * @return true=有效，false=无效
     */
    public static boolean isValidBusinessType(Integer businessType) {
        return businessType != null && businessType >= 0 && businessType < BUSINESS_TYPE_DESCRIPTIONS.length;
    }

    /**
     * 验证操作类别是否有效
     * 
     * @param operatorType 操作类别
     * @return true=有效，false=无效
     */
    public static boolean isValidOperatorType(Integer operatorType) {
        return operatorType != null && operatorType >= 0 && operatorType < OPERATOR_TYPE_DESCRIPTIONS.length;
    }

    /**
     * 验证模块标题是否有效
     * 
     * @param title 模块标题
     * @return true=有效，false=无效
     */
    public static boolean isValidTitle(String title) {
        if (title == null || title.trim().isEmpty()) {
            return true; // 模块标题可以为空
        }
        return title.length() <= TITLE_MAX_LENGTH;
    }

    /**
     * 验证方法名称是否有效
     * 
     * @param method 方法名称
     * @return true=有效，false=无效
     */
    public static boolean isValidMethod(String method) {
        if (method == null || method.trim().isEmpty()) {
            return true; // 方法名称可以为空
        }
        return method.length() <= METHOD_MAX_LENGTH;
    }

    /**
     * 验证请求方式是否有效
     * 
     * @param requestMethod 请求方式
     * @return true=有效，false=无效
     */
    public static boolean isValidRequestMethod(String requestMethod) {
        if (requestMethod == null || requestMethod.trim().isEmpty()) {
            return true; // 请求方式可以为空
        }
        if (requestMethod.length() > REQUEST_METHOD_MAX_LENGTH) {
            return false;
        }
        return requestMethod.matches(REQUEST_METHOD_PATTERN);
    }

    /**
     * 验证操作人员是否有效
     * 
     * @param operName 操作人员
     * @return true=有效，false=无效
     */
    public static boolean isValidOperName(String operName) {
        if (operName == null || operName.trim().isEmpty()) {
            return true; // 操作人员可以为空
        }
        return operName.length() <= OPER_NAME_MAX_LENGTH;
    }

    /**
     * 验证IP地址是否有效
     * 
     * @param operIp IP地址
     * @return true=有效，false=无效
     */
    public static boolean isValidOperIp(String operIp) {
        if (operIp == null || operIp.trim().isEmpty()) {
            return true; // IP地址可以为空
        }
        if (operIp.length() > OPER_IP_MAX_LENGTH) {
            return false;
        }
        return operIp.matches(OPER_IP_PATTERN);
    }

    /**
     * 验证消耗时间是否有效
     * 
     * @param costTime 消耗时间
     * @return true=有效，false=无效
     */
    public static boolean isValidCostTime(Long costTime) {
        if (costTime == null) {
            return true; // 消耗时间可以为空
        }
        return costTime >= 0 && costTime <= MAX_COST_TIME;
    }

    /**
     * 判断是否为操作正常
     * 
     * @param status 操作状态
     * @return true=正常，false=异常
     */
    public static boolean isOperNormal(Integer status) {
        return OPER_STATUS_NORMAL == status;
    }

    /**
     * 判断是否为操作异常
     * 
     * @param status 操作状态
     * @return true=异常，false=正常
     */
    public static boolean isOperException(Integer status) {
        return OPER_STATUS_EXCEPTION == status;
    }

    /**
     * 判断是否为新增操作
     * 
     * @param businessType 业务类型
     * @return true=新增，false=其他
     */
    public static boolean isInsertOperation(Integer businessType) {
        return BUSINESS_TYPE_INSERT == businessType;
    }

    /**
     * 判断是否为修改操作
     * 
     * @param businessType 业务类型
     * @return true=修改，false=其他
     */
    public static boolean isUpdateOperation(Integer businessType) {
        return BUSINESS_TYPE_UPDATE == businessType;
    }

    /**
     * 判断是否为删除操作
     * 
     * @param businessType 业务类型
     * @return true=删除，false=其他
     */
    public static boolean isDeleteOperation(Integer businessType) {
        return BUSINESS_TYPE_DELETE == businessType;
    }

    /**
     * 判断是否为后台用户操作
     * 
     * @param operatorType 操作类别
     * @return true=后台用户，false=其他
     */
    public static boolean isManageOperator(Integer operatorType) {
        return OPERATOR_TYPE_MANAGE == operatorType;
    }

    /**
     * 判断是否为手机端用户操作
     * 
     * @param operatorType 操作类别
     * @return true=手机端用户，false=其他
     */
    public static boolean isMobileOperator(Integer operatorType) {
        return OPERATOR_TYPE_MOBILE == operatorType;
    }

    /**
     * 清理模块标题（去除多余空格）
     * 
     * @param title 原始模块标题
     * @return 清理后的模块标题
     */
    public static String cleanTitle(String title) {
        if (title == null) {
            return "";
        }
        return title.trim().replaceAll("\\s+", " ");
    }

    /**
     * 清理方法名称（去除多余空格）
     * 
     * @param method 原始方法名称
     * @return 清理后的方法名称
     */
    public static String cleanMethod(String method) {
        if (method == null) {
            return "";
        }
        return method.trim().replaceAll("\\s+", " ");
    }

    /**
     * 清理请求方式（转换为大写）
     * 
     * @param requestMethod 原始请求方式
     * @return 清理后的请求方式
     */
    public static String cleanRequestMethod(String requestMethod) {
        if (requestMethod == null) {
            return "";
        }
        return requestMethod.trim().toUpperCase();
    }

    /**
     * 清理操作人员（去除多余空格）
     * 
     * @param operName 原始操作人员
     * @return 清理后的操作人员
     */
    public static String cleanOperName(String operName) {
        if (operName == null) {
            return "";
        }
        return operName.trim().replaceAll("\\s+", " ");
    }

    /**
     * 清理IP地址（去除多余空格）
     * 
     * @param operIp 原始IP地址
     * @return 清理后的IP地址
     */
    public static String cleanOperIp(String operIp) {
        if (operIp == null) {
            return "";
        }
        return operIp.trim();
    }
}
